<?php

namespace Aanmelden\Model;

class Registreren {
    private $_json = ['resultaat'=>true,'boodschap'=>''];
    private $_gegevens = ['aanhef'=>'','naam'=>'','voornaam'=>'','email'=>'','login'=>''];
    private $_aCode = '';
    
    public function registreer() {
        if ($this->_gegevens()) {
            $this->_registreerGebruiker();
        }
        
        return $this->_json;
    }
    
    private function _gegevens() {
        $lijst = [];
        foreach($this->_gegevens as $sleutel => $waarde) {
            $this->_gegevens[$sleutel] = filter_input(INPUT_POST,$sleutel,FILTER_SANITIZE_STRING);
            if (!$this->_gegevens[$sleutel]) {
                array_push($lijst,$sleutel);
            }
        }
        
        if (count($lijst) > 0) {
            $this->_json['boodschap'] = 'volgende velden ontbreken: '.implode(', ',$lijst);
            $this->_json['resultaat'] = false;
            return false;
        }
        
        if (!filter_var($this->_gegevens['email'],FILTER_VALIDATE_EMAIL)) {
            $this->_json['boodschap'] = 'ongeldige e-mail';
            $this->_json['resultaat'] = false;
        }
        
        if (strlen($this->_gegevens['login']) < 8) {
            $this->_json['boodschap'] = 'login moet minstens 8 karakters tellen';
            $this->_json['resultaat'] = false;
            return false;
        }
        
        return true;
    }
    
    private function _registreerGebruiker() {
        $dbSql = "SELECT 1 FROM persoon WHERE email=:email";
        try {
            $dbStmt = \Db::GET()->prepare($dbSql);
            $dbStmt->execute([':email'=>$this->_gegevens['email']]);
            if ($dbStmt->rowCount() > 0) {
                $this->_json['boodschap'] = 'e-mail is reeds aan een gebruiker gekoppeld';
                $this->_json['resultaat'] = false;
                return;
            }
            
            $this->_genereerActivatieCode();
            if ($this->_bewaarGebruiker()) {
                $this->_persoonStuurMail();
            } else {
                $this->_json['boodschap'] = 'de registratie heeft helaas gefaald...';
                $this->_json['resultaat'] = false;
            }
        } catch (PDOException $ex) {

        }
    }
    
    private function _bewaarGebruiker() {
        $dbSql = "INSERT INTO persoon (aanhef,naam,voornaam,login,email,status,code)
                  VALUES (:aanhef,:naam,:voornaam,:login,:email,1,:code)";
        try {
            $dbStmt = \Db::GET()->prepare($dbSql);
            $dbStmt->execute([':aanhef'=>$this->_gegevens['aanhef'],
                              ':naam'=>$this->_gegevens['naam'],
                              ':voornaam'=>$this->_gegevens['voornaam'],
                              ':login'=>$this->_gegevens['login'],
                              ':email'=>$this->_gegevens['email'],
                              ':code'=>$this->_aCode]);
            if ($dbStmt->rowCount() > 0) {
                return true;
            } else {
                $this->_json['resultaat'] = false;
                return false;
            }
        } catch (PDOException $ex) {
            return false;
        }
    }
    
    private function _genereerActivatieCode() {
        $dbSql = "SELECT 1 FROM persoon WHERE code=:code";
        try {
            $dbStmt = \Db::GET()->prepare($dbSql);
            do {
                $codeTest = true;
                $this->_aCode = sha1(microtime());
                $dbStmt->execute([':code'=>$this->_aCode]);
                if ($dbStmt->rowCount() == 0) {
                    $codeTest = false;
                }
            } while ($codeTest);            
        } catch (Exception $ex) {
            $this->_json['resultaat'] = false;
        }
    }
    
    private function _persoonStuurMail() {
        $aLink = \Instelling::GET('website.root').'Aanmelden/Activeer/index/0/?acode='.$this->_aCode;
        $mail = new \MimeMessage();
        $naam = implode(' ',[$this->_gegevens['voornaam'],$this->_gegevens['naam']]);
        $html = <<<EOD
             <h1><small>Beste </small>{$naam}</h1>
             <p>Activeer je account opnieuw door op volgende koppeling te klikken: <a href="{$aLink}">activeer mijn account</a></p>
             <p>met vriendelijk groet,<br>het team</p>
EOD;
        $mail->msgFrom(\Instelling::GET('website.mail.from'));
        $mail->msgReplyTo(\Instelling::GET('website.mail.replyto'));
        $mail->msgSubject('Activeer je account');
        $mail->msgTo($this->_gegevens['email']);
        $mail->msgHtml($html);
        if ($mail->sendMessage()) {
            
        } else {
            $this->_json['boodschap'] = 'het versturen van de activatiemail is gefaald';
            $this->_json['resultaat'] = false;
        }
    }
    
    
}
